package main

import (
	"fmt"
)

// 语言类型别名

// 将NewInt定义为int类型: type Defined
type NewInt int

// 将int取一个别名叫IntAlias : type Alias
type IntAlias = int

func main() {

	var a NewInt
	fmt.Printf("a type: %T\n", a)

	var a2 IntAlias
	fmt.Printf("a2 type: %T\n", a2)

	var b int = 100
	// 将b赋值给a, 报错 cannot use b (type int) as type NewInt in assignment
	// a = b
	// 将b赋值给a2, 正常
	a2 = b
	fmt.Println("a2 value:", a2)

	var m MyInt = 10
	fmt.Println("Is m positive?", m.IsPositive())

}

// defined vs alias 的区别
// | 维度     | 类型别名 `=`   | 类型定义 无 `=`     |
// | ------ 	| ---------- | -------------- |
// | 是否新类型  | ❌ 完全等价原类型  | ✅ 全新类型         |
// | 能否互赋   | 直接赋，无需转换   | 必须显式 `T(v)` 转换 |
// | 能否绑定方法 | ❌ 不行       | ✅ 可以           |
// | 接口实现   | 随原类型       | 自己独立实现         |
// | 适用场景   | 简化长名字、迁移兼容 | 封装行为、防止混用      |

// 不能为不在一个包中的类型定义方法: 类似rust的孤儿规则
// func (m int) IsPositive() bool {  //cannot define new methods on non-local type int
//
//		return m > 0
//	}
//
// 使用type defined绕开孤儿规则
type MyInt int

// 为MyInt绑定一个方法
func (m MyInt) IsPositive() bool {
	return m > 0
}
